抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >
  • 信息的储存

    • 十六进制表示法

      对于描述二进制位非常方便,四个二进制位恰好对应一个十六进制位

    • 字数据大小

      计算机的虚拟地址是用一个字长表示的,即字长会直接影响最大可表示的地址空间

      在32位机器上,最多寻址4GB,而64位机器最多寻址16EB

      字长还影响变量的数值范围,具体情况因平台实现而异

    • 寻址和字节顺序

      对于数值在硬件中的实际排布,根据低地址处放置是高或低有效位,分为大端法和小端法

      主流硬件采用小端法,而网络通信中通常使用大端法

      小端法符合硬件处理数据的顺序,而大端法更符合主观直觉

    • 布尔代数

      有值:True、False,和运算:AND、OR、NOT、XOR、etc.

      C语言分别用&、|、~、^,表示按位与、按位或、按位取反,按位异或

      ​ 分别用&&、||、!,表示逻辑与、逻辑或、逻辑反

      ​ 用<<表示按位左移,高位将丢弃,低位补0

      ​ 用>>表示按位右移,低位将丢弃,高位通常情况下补符号位(但C语言标准并没有具体规定)

  • 整数的表示

    • 无符号数的编码

      表示的数值等于二进制值

    • 有符号数的编码(补码)

      最高有效位是符号位,或权重,其代表,编码表示的值等于

      对于有位的补码编码,其表示的数值范围不是对称的,下界为,上界为

      通过补码,加法和减法可以在硬件中统一处理(即使是带符号数),这是它在计算机中的优点。

    • 有符号整数和无符号整数之间的转换

      在C语言中使用强制类型转换,数值的bit不会改变,只是改变了bit的解释方式

      当执行运算,运算数同时包含有符号数和无符号数时,有符号数会被隐式转换为无符号数

      当转换的值没有超过对方类型的数值范围,则数值不会被改变,否则会发生溢出

      溢出后数值的变化:

      1. 负数补码到无符号数

        原数有位,转换到无符号数时,如果原数为(负数),得到的值为(即模的结果)

      2. 无符号数到有符号数补码,且超出补码的表示范围

        原数为,最高有效位,则转为有符号数后需要减去2倍符号位权重,变为

  • 整数的运算

    • 无符号加法

      对于两个位的无符号数有:

      无符号加法
    • 补码加法

      对于两个位的补码整数有:

      补码加法

      简单记作:补码加法溢出发生时,结果会被截断,确保结果在可表示范围内

    • 补码的加法逆元

      对于加法下的,满足,则称的加法逆元,一般情况下,的加法逆元就是

      由于补码的表示范围不对称,对于位补码可以表示的最小值,逆元超出了表示范围

      因此利用补码溢出的性质可以得到:

      简单记作:除了最小值的加法逆元是它本身,的加法逆元都是

    • 无符号乘法

      对于位的无符号数可能超过位的表示范围,溢出时发生bit的截断,即:

    • 补码乘法

      对于位的补码数溢出时,如上述发生bit的截断,剩下的bit再以补码规则处理

      简单记作:乘法溢出发生时,丢弃高位,再按照相应规则处理

    • 乘以常数

      对于二进制数,位的左移位操作相当于对该数乘以,编译器常常会利用这点进行优化,减少计算量,例如:

    • 除以2的幂

      与上述相似,位的算术右移位操作(高位补符号位)相当于对该数除以,利用该点可以进行优化

      但是直接右移丢弃了尾部的bit,造成了最终结果是向下舍入的整数

      可以通过在右移位之前向原数加上的偏置值,使得最终结果是向0舍入的整数




博客内容遵循 [署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)
本站使用 Volantis 作为主题
粤ICP备2026019407号